После завершения этого раздела вы сможете запускать контейнеры с расширенными опциями, отображать контейнеры, запущенные в системе, а также запускать, останавливать и уничтожать контейнеры.
Вы можете использовать утилиту Podman для запуска контейнеров с расширенными опциями конфигурации, а также управления запущенными и остановленными контейнерами. В этом разделе вы узнаете, как использовать Podman для управления контейнерами в течение их жизненного цикла.
Вы использовали команду podman run для запуска контейнеров из образов контейнеров в другом упражнении. Когда вы запускаете контейнер, он запускает процесс внутри нового контейнера. Процесс может быть приложением, например веб-сервером или сервером базы данных. Этому приложению может потребоваться взаимодействовать с другими системами по сети и, следовательно, может потребоваться его настройка.
podman run
Чтобы получить сетевой доступ к контейнеру, клиенты должны подключаться к портам на хосте контейнеров, передающим сетевой трафик на порты контейнера. Для настройки контейнера, как правило, можно передать контейнеру некоторые переменные окружения с пользовательскими параметрами вместо изменения образа контейнера.
Когда сетевой порт на хосте контейнеров сопоставляется с портом контейнера, контейнер получает сетевой трафик, отправляемый на сетевой порт хоста.
Например, можно сопоставить порт 8000 хоста контейнеров с портом 8080 контейнера. В контейнере может быть запущен процесс httpd, прослушивающий порт 8080. Поэтому трафик, отправляемый на порт 8000 хоста контейнеров, будет получен веб-сервером, запущенным в контейнере.
httpd
Для настройки сопоставления портов используется команда podman run с опцией -p. Она принимает два номера портов, разделенных двоеточием: порт хоста контейнеров, за которым следует порт контейнера.
-p
В приведенном далее примере используется опция -d для запуска контейнера в отсоединенном режиме (в виде демона). При использовании опции -d команда podman выводит на экран только идентификатор контейнера. Опция -p 8000:8080 сопоставляет порт 8000 хоста контейнеров с портом 8080 контейнера. Образ контейнера registry.redhat.io/rhel8/httpd-24 запускает HTTP-сервер Apache, который прослушивает подключения на порту 8080.
-d
podman
-p 8000:8080
registry.redhat.io/rhel8/httpd-24
[user@host ~]$ podman run -d -p 8000:8080 registry.redhat.io/rhel8/httpd-24 4a24ee199b909cc7900f2cd73c07e6fce9bd3f53b14e6757e91368c561a8edf4 [user@host ~]$
[user@host ~]$
podman run -d -p 8000:8080 registry.redhat.io/rhel8/httpd-24
Вы можете использовать команду podman port с идентификатором или именем контейнера, чтобы отобразить его сопоставления портов, или с опцией -a, чтобы отобразить все используемые сопоставления портов. В следующем примере показаны все сопоставления портов, заданные на хосте контейнеров. Вывод указывает, что порт 8000 хоста контейнеров сопоставлен с портом 8080/tcp контейнера с идентификатором, начинающимся на 4a24ee199b90.
podman port
-a
4a24ee199b90
[user@host ~]$ podman port -a 4a24ee199b90 8080/tcp -> 0.0.0.0:8000
podman port -a
Кроме того, необходимо убедиться, что брандмауэр на хосте контейнеров позволяет внешним клиентам подключаться к сопоставленному порту. В предыдущем примере также может потребоваться добавить порт 8000/tcp в текущие правила брандмауэра на хосте контейнеров.
[root@host ~]# firewall-cmd --add-port=8000/tcp success
[root@host ~]#
firewall-cmd --add-port=8000/tcp
Контейнер без прав root не может открыть на хосте контейнеров порт с номером меньше 1024 («привилегированные порты»). То есть опция -p 80:8080 не будет работать для контейнера, который запускается пользователем, отличным от root. Это ограничение для пользователей, отличных от root, в системе Linux. Чтобы сопоставить порт ниже 1024 на хосте контейнеров с портом контейнера, необходимо выполнить команду podman как пользователь root или внести другие изменения в систему.
-p 80:8080
root
Вы можете сопоставить порт выше 1024 на хосте контейнеров с привилегированным портом контейнера, даже если вы работаете с контейнером без прав root. Сопоставление -p 8080:80 работает, если контейнер предоставляет службу, которая прослушивает порт 80.
-p 8080:80
Настройка контейнера может быть сложной задачей, так как обычно вы не изменяете образ контейнера для настройки. Однако вы можете передать контейнеру переменные окружения, а контейнер может использовать значения этих переменных для настройки приложения.
Чтобы узнать, какие переменные доступны и что они делают, используйте команду podman inspect для просмотра сведений об образе контейнера. Например, ниже приведен образ контейнера из одного из реестров Red Hat.
podman inspect
[user@host ~]$ podman inspect registry.redhat.io/rhel8/mariadb-103:1-102 [ { ...output omitted... "Labels": { ...output omitted... "name": "rhel8/mariadb-103", "release": "102", "summary": "MariaDB 10.3 SQL database server", "url": "https://access.redhat.com/containers/#/registry.access.redhat.com/rhel8/mariadb-103/images/1-102", "usage": "podman run -d -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -p 3306:3306 rhel8/mariadb-103", "vcs-ref": "ab3c3f15b6180b967a312c93e82743e842a4ac7c", "vcs-type": "git", "vendor": "Red Hat, Inc.", "version": "1" }, ...output omitted...
podman inspect registry.redhat.io/rhel8/mariadb-103:1-102
"url": "https://access.redhat.com/containers/#/registry.access.redhat.com/rhel8/mariadb-103/images/1-102",
"usage": "podman run -d -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -p 3306:3306 rhel8/mariadb-103",
Метка url указывает на веб-страницу в Red Hat Container Catalog, на которой описываются переменные среды и приведены другие сведения об использовании образа контейнера. Метка usage предоставляет пример обычной команды podman для запуска образа.
url
usage
На странице, указанной в метке url для этого образа, показано, что контейнер использует порт 3306 для сервера базы данных и доступны следующие переменные окружения для настройки службы базы данных:
MYSQL_USER
Имя пользователя для создаваемой учетной записи MySQL.
MYSQL_PASSWORD
Пароль для учетной записи пользователя.
MYSQL_DATABASE
Имя базы данных.
MYSQL_ROOT_PASSWORD
Пароль пользователя root (необязательно).
Используйте команду podman run с опцией -e для передачи переменных окружения процессу внутри контейнера. В следующем примере опции окружения и портов применяют параметры конфигурации к контейнеру.
-e
[user@host ~]$ podman run -d --name container_name -e MYSQL_USER=user_name -e MYSQL_PASSWORD=user_password -e MYSQL_DATABASE=database_name -e MYSQL_ROOT_PASSWORD=mysql_root_password -p 3306:3306 registry.redhat.io/rhel8/mariadb-103:1-102 abcb42ef2ff1b85a50e3cd9bc15877ef823979c8166d0076ce5ebc5ea19c0815
podman run -d --name container_name -e MYSQL_USER=user_name -e MYSQL_PASSWORD=user_password -e MYSQL_DATABASE=database_name -e MYSQL_ROOT_PASSWORD=mysql_root_password -p 3306:3306 registry.redhat.io/rhel8/mariadb-103:1-102
Опция --name назначает контейнеру указанное имя, что упрощает идентификацию данного контейнера. Если вы не зададите имя контейнера, podman назначит произвольное имя.
--name
Создание и запуск контейнера ― это только первый шаг в жизненном цикле контейнера. Этот жизненный цикл также включает остановку, повторный запуск и удаление контейнера. Кроме того, пользователи могут просматривать состояние и метаданные контейнера с целью отладки, обновления или создания отчетов.
Команда podman ps отображает список запущенных контейнеров.
podman ps
[user@host ~]$ podman ps CONTAINER ID IMAGE COMMAND 89dd9b6354ba registry.redhat.io/rhel8/mariadb-103:1-102 run-mysqld CREATED STATUS PORTS NAMES 10 minutes ago Up 10 seconds 0.0.0.0:3306->3306/tcp my-database
Каждому создаваемому контейнеру назначается уникальный шестнадцатеричный идентификатор. Идентификатор контейнера не связан с идентификатором образа.
Образ контейнера, который использовался для запуска контейнера.
Команда, которая была выполнена при запуске контейнера.
Дата и время запуска контейнера.
Общее время работы контейнера (если он еще работает) или время после завершения.
Порты, которые контейнер сделал доступными, или переадресация портов, если она была настроена.
Имя контейнера.
По умолчанию утилита Podman не удаляет сразу остановленные контейнеры, а хранит их локальные файловые системы и другие состояния для облегчения анализа после завершения работы, если только вы не запустите контейнер повторно. Если вы запустите контейнер, используя команду podman run с опцией --rm, контейнер будет автоматически удален после завершения работы.
--rm
Команда podman ps -a отображает все контейнеры, включая остановленные.
podman ps -a
[user@host ~]$ podman ps -a CONTAINER ID IMAGE COMMAND 30b743973e98 registry.redhat.io/rhel8/httpd-24:1-105 /bin/bash CREATED STATUS PORTS NAMES 17 minutes ago Exited (0) 18 minutes ago 80/tcp my-httpd
При создании контейнера утилита podman прерывает работу, если имя контейнера уже используется, даже если контейнер находится в остановленном состоянии. Такая мера защиты предотвращает дублирование имен контейнеров.
Команда podman stop останавливает запущенный контейнер безопасным образом. Команда stop отправляет сигнал SIGTERM для завершения работы запущенного контейнера. Если контейнер не останавливается после периода отсрочки (по умолчанию 10 секунд), Podman отправляет сигнал SIGKILL.
podman stop
stop
[user@host ~]$ podman stop my-httpd-container 77d4b7b8ed1fd57449163bcb0b78d205e70d2314273263ab941c0c371ad56412
podman stop my-httpd-container
Если образ контейнера используется остановленным контейнером, для его удаления с помощью команды podman rmi или podman image rm необходимо включить опцию -f, которая сначала удаляет все контейнеры, использующие этот образ.
podman rmi
podman image rm
-f
Команда podman rm удаляет контейнер с хоста. Контейнер должен быть остановлен. В противном случае необходимо включить опцию -f, которая также удаляет запущенные контейнеры. Команда podman rm -a удаляет все остановленные контейнеры с хоста. Идентификаторы всех удаляемых контейнеров выводятся на экран.
podman rm
podman rm -a
[user@host ~]$ podman rm my-database abcb42ef2ff1b85a50e3cd9bc15877ef823979c8166d0076ce5ebc5ea19c0815
podman rm my-database
Команда podman restart повторно запускает остановленный контейнер. Команда создает новый контейнер с идентификатором остановленного контейнера, используя его состояние и файловую систему.
podman restart
[user@host ~]$ podman restart my-httpd-container 77d4b7b8ed1fd57449163bcb0b78d205e70d2314273263ab941c0c371ad56412
podman restart my-httpd-container
Команда podman kill отправляет сигналы UNIX главному процессу в контейнере. Это те же сигналы, которые используются командой kill.
podman kill
kill
Это может быть полезно, если главный процесс в контейнере может выполнять действия при получении определенных сигналов, а также для устранения проблем. Если сигнал не указан, команда podman kill отправляет сигнал SIGKILL, завершающий главный процесс и контейнер.
[user@host ~]$ podman kill my-httpd-container 77d4b7b8ed1fd57449163bcb0b78d205e70d2314273263ab941c0c371ad56412
podman kill my-httpd-container
Сигнал можно указать с помощью опции -s.
-s
[user@host ~]$ podman kill -s SIGKILL my-httpd-container 77d4b7b8ed1fd57449163bcb0b78d205e70d2314273263ab941c0c371ad56412
podman kill -s SIGKILL my-httpd-container
Любой сигнал UNIX может быть отправлен в главный процесс. Команда podman kill принимает имя или номер сигнала.
Команда podman stop пытается выполнить команду stop для образа контейнера и в случае неудачи отправляет контейнеру сигналы SIGTERM и SIGKILL.
SIGTERM
SIGKILL
Когда контейнер запускается, он выполняет команду, предусмотренную в качестве точки входа в образе контейнера. Однако вам может потребоваться выполнить другие команды для управления запущенным контейнером. Например, вам может потребоваться присоединить интерактивную командную оболочку к запущенному контейнеру, чтобы получить сведения о нем или выполнить отладку.
Команда podman exec запускает дополнительный процесс внутри запущенного контейнера.
podman exec
[user@host ~]$ podman exec 7ed6e671a600 cat /etc/redhat-release Red Hat Enterprise Linux release 8.2 (Ootpa) [user@host ~]$
podman exec 7ed6e671a600 cat /etc/redhat-release
В предыдущем примере для выполнения команды используется идентификатор контейнера. Часто проще использовать вместо него имя контейнера. Если требуется присоединить интерактивную командную оболочку, необходимо указать опции -i и -t, чтобы открыть интерактивный сеанс и выделить псевдотерминал для оболочки.
-i
-t
[user@host ~]$ podman exec -it my_webserver /bin/bash bash-4.4$ hostname 7ed6e671a600 bash-4.4$ exit [user@host ~]$
podman exec -it my_webserver /bin/bash
bash-4.4$
hostname
exit
Podman запоминает последний контейнер, использовавшийся в любой команде. Можно указать опцию -l, чтобы использовать идентификатор или имя контейнера из предыдущей команды Podman в новой команде.
-l
[user@host ~]$ podman exec -l cat /etc/redhat-release Red Hat Enterprise Linux release 8.2 (Ootpa) [user@host ~]$
podman exec -l cat /etc/redhat-release
Man-страницы podman-run(1), podman-exec(1), podman-ps(1), podman-stop(1), podman-restart(1), podman-kill(1), podman-rm(1), podman-rmi(1), podman-images(1) и podman-port(1)
podman-run
podman-exec
podman-ps
podman-stop
podman-restart
podman-kill
podman-rm
podman-rmi
podman-images
podman-port
Дополнительные сведения см. в главе Working With Containers руководства Red Hat Enterprise Linux 8 Building, Running, and Managing Containers: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html-single/building_running_and_managing_containers/index#working-with-containers_building-running-and-managing-containers